/*
 * Copyright (c) 2011, Michael Hengler (developer (at) hengler (dot) de),
 * Nikolaus Moll (developer (at) miblounge (dot) net).
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * * Neither the name of the Jombi project nor the
 * names of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL JOMBI BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
package net.miblounge.jombi.impl.widgets;

import net.miblounge.jombi.impl.util.OrientationConvert;

import org.jowidgets.common.widgets.factory.IGenericWidgetFactory;
import org.jowidgets.spi.widgets.IToolBarButtonSpi;
import org.jowidgets.spi.widgets.IToolBarContainerItemSpi;
import org.jowidgets.spi.widgets.IToolBarItemSpi;
import org.jowidgets.spi.widgets.IToolBarPopupButtonSpi;
import org.jowidgets.spi.widgets.IToolBarSpi;
import org.jowidgets.spi.widgets.IToolBarToggleButtonSpi;
import org.jowidgets.spi.widgets.setup.IToolBarSetupSpi;

import com.trolltech.qt.gui.QAction;
import com.trolltech.qt.gui.QMainWindow;
import com.trolltech.qt.gui.QToolBar;
import com.trolltech.qt.gui.QToolButton;
import com.trolltech.qt.gui.QWidget;

public class ToolBarImpl extends QtControl implements IToolBarSpi {

	private final IGenericWidgetFactory factory;

	public ToolBarImpl(final IGenericWidgetFactory factory, final Object parentUiReference, final IToolBarSetupSpi setup) {
		super(new QToolBar((QWidget) parentUiReference));

		if (!(((QWidget) parentUiReference).parentWidget() instanceof QMainWindow)) {
			getUiReference().setStyleSheet("QToolBar { border: 0px }");
			//			if (getUiReference().parentWidget().layout() instanceof MigLayout) {
			//				final MigLayout layout = (MigLayout) getUiReference().parentWidget().layout();
			//			}
		}

		getUiReference().setOrientation(OrientationConvert.convert(setup.getOrientation()));
		this.factory = factory;
	}

	@Override
	public QToolBar getUiReference() {
		return (QToolBar) super.getUiReference();
	}

	@Override
	public void remove(final int index) {
		getUiReference().removeAction(getUiReference().actions().get(index));
		// TODO NM dispose?
	}

	protected boolean validIndex(final Integer index) {
		return (index != null) && (index.intValue() < getUiReference().actions().size());
	}

	protected QAction addItem(final QWidget widget, final Integer index) {
		if (validIndex(index)) {
			final QAction before = getUiReference().actions().get(index);
			return getUiReference().insertWidget(before, widget);
		} else {
			return getUiReference().addWidget(widget);
		}
	}

	protected QAction addItem(final QAction action, final Integer index) {
		if (validIndex(index)) {
			final QAction before = getUiReference().actions().get(index);
			getUiReference().insertAction(before, action);
		} else {
			getUiReference().addAction(action);
		}
		return action;
	}

	protected QToolButton createAndInsertAction(final Integer index) {
		final QToolButton result = new QToolButton(getUiReference());
		addItem(result, index);
		return result;
	}

	@Override
	public IToolBarButtonSpi addToolBarButton(final Integer index) {
		return new ToolBarButtonImpl(createAndInsertAction(index));
	}

	@Override
	public IToolBarToggleButtonSpi addToolBarToggleButton(final Integer index) {
		return new ToolBarToggleButtonImpl(createAndInsertAction(index));
	}

	@Override
	public IToolBarPopupButtonSpi addToolBarPopupButton(final Integer index) {
		final QToolButton button = new QToolButton(getUiReference());
		addItem(button, index);
		return new ToolBarPopupButtonImpl(button);
	}

	@Override
	public IToolBarContainerItemSpi addToolBarContainer(final Integer index) {
		// TODO check if it works...
		final QWidget composite = new QWidget(getUiReference());
		final QAction toolItem = addItem(composite, index);
		return new ToolBarContainerItemImpl(toolItem, composite, factory);
	}

	@Override
	public IToolBarItemSpi addSeparator(final Integer index) {
		// TODO check if it works...
		final QAction toolItem;
		if (validIndex(index)) {
			final QAction before = getUiReference().actions().get(index);
			toolItem = getUiReference().insertSeparator(before);
		} else {
			toolItem = getUiReference().addSeparator();
		}
		return new ToolBarActionItemImpl(toolItem);
	}

	@Override
	public void pack() {
		getUiReference().adjustSize();
	}

}
